package team.bluepen.supermarket.util;

import team.bluepen.supermarket.constant.Error;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件实用类
 * @author Kai
 */
public final class FileUtil {
    /**
     * 将字符串写入文件（若文件已存在会继续写入）
     * @param path 文件路径
     * @param content 写入内容
     * @return {@link Error} 枚举类
     */
    public static Error writeFile(String path, String content) {
        return writeFile(path, content, true);
    }

    /**
     * 将字符串写入文件
     * @param path 文件路径
     * @param content 写入内容
     * @param append 如果文件存在是否覆盖
     * @return {@link Error} 枚举类
     */
    public static Error writeFile(String path, String content, boolean append) {
        if (StringUtil.isEmpty(path)){
            return Error.ERROR_FILE_NOT_FOUND;
        }
        File file = new File(path);
        FileOutputStream stream = null;
        try {
            if (file.exists()){
                if (append){
                    stream = new FileOutputStream(file, true);
                } else {
                    stream = new FileOutputStream(file, false);
                }
            } else {
                stream = new FileOutputStream(file);
            }
            if (!file.createNewFile()){
                return Error.ERROR_FILE;
            }
            stream.write(content.getBytes(StandardCharsets.UTF_8));
        } catch (IOException e){
            return Error.ERROR_IO;
        } finally {
            try {
                if (stream != null){
                    stream.close();
                }
            } catch (IOException e) {
                //
            }
        }
        return Error.SUCCESS;
    }

    /**
     * 删除文件
     * @param path 路径
     * @return {@link Error} 枚举类
     */
    public static Error deleteFile(String path) {
        if (StringUtil.isEmpty(path)){
            return Error.ERROR_FILE_NOT_FOUND;
        }
        return deleteFile(new File(path));
    }

    /**
     * 删除文件
     * @param file 文件
     * @return {@link Error} 枚举类
     */
    public static Error deleteFile(File file) {
        if (file == null || !file.exists()){
            return Error.ERROR_FILE_NOT_FOUND;
        }
        if (file.delete()){
            return Error.SUCCESS;
        } else {
            return Error.ERROR_EXCEPTION;
        }
    }

    /**
     * 获取文件大小
     * @param path 路径
     * @return 文件大小
     */
    public static long getFileSize(String path) {
        File file = new File(path);
        if (!file.exists()){
            return 0;
        }
        return file.length();
    }

    /**
     * 获取文件大小
     * @param file 文件
     * @return 文件大小
     */
    public static long getFileSize(File file) {
        if (file == null){
            return 0;
        }
        if (!file.exists()){
            return 0;
        }
        return file.length();
    }

    public static String getReadableSize(long bytes) {
        long absB = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes);
        if (absB < 1024) {
            return bytes + " B";
        }
        long value = absB;
        CharacterIterator ci = new StringCharacterIterator("KMGTPE");
        for (int i = 40; i >= 0 && absB > 0xfffccccccccccccL >> i; i -= 10) {
            value >>= 10;
            ci.next();
        }
        value *= Long.signum(bytes);
        return String.format("%.1f %cB", value / 1024.0, ci.current());
    }

    /**
     * 由文件名获取后缀名
     * @param path 路径
     * @return 后缀名
     * */
    public static String getFileNameSuffix(String path){
        if (path == null) {
            return null;
        }
        int start = path.lastIndexOf(".");
        if (start != -1) {
            return path.substring(start + 1);
        } else {
            return "";
        }
    }

    /**
     * 删除指定目录下文件及目录
     * @param path 文件夹路径
     */
    public static boolean deleteFolderFile(String path) {
        if (path == null) {
            return false;
        }
        File file = new File(path);
        if (file.isDirectory()) {// 处理目录
            File[] files = file.listFiles();
            assert files != null;
            for (File value : files) {
                if (!deleteFolderFile(value.getAbsolutePath())){
                    return false;
                }
            }
        }
        if (!file.isDirectory()) {// 如果是文件，删除
            return file.delete();
        } else {// 目录
            if (file.listFiles() != null && file.listFiles().length == 0) {// 目录下没有文件或者目录，删除
                return file.delete();
            }
        }
        return true;
    }

    public static List<File> getAllFiles(String path) {
        if (path == null || path.isEmpty()) {
            return new ArrayList<>();
        }
        File file = new File(path);
        if (!file.exists()) {
            return new ArrayList<>();
        }
        List<File> files = new ArrayList<>();
        if (file.isDirectory()) {
            File[] files1 = file.listFiles();
            if (files1 != null) {
                for (File file1 : files1) {
                    files.addAll(getAllFiles(file1.getAbsolutePath()));
                }
            }
        } else {
            files.add(file);
        }

        return files;
    }

    public static String getFileName(String path) {
        String[] splits = path.split("/");
        return splits[splits.length - 1];
    }
}
